﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using TestesFixacao.Dominio.Modelos;

namespace TestesFixacao.Dominio.Repositorios.ADO
{
    public class RepositorioAdoSerie : IRepositorioSerie
    {
        #region querys

        private const string SqlInsereSerie =
            @"INSERT INTO [TBSerie]
                ([descricao])
            VALUES
                ({0}descricao)";

        private const string SqlEditaSerie =
            @"UPDATE [TBSerie]
                SET
                    [descricao]={0}descricao

                WHERE [numero]={0}numero";

        private const string SqlExcluiSerie =
           @"DELETE FROM [TBSerie]
                WHERE [numero]={0}numero";

        private const string SqlSelecionaTodasSeries =
           @"SELECT
                NUMERO,
                DESCRICAO
            FROM
                [TBSerie]";

        private const string SqlSelecionaSeriePorNumero =
           @"SELECT
                NUMERO,
                DESCRICAO
            FROM
                [TBSerie]
            WHERE [numero]={0}numero";

        #endregion querys

        #region IRepositorio

        public void Adiciona(Serie serie)
        {
            serie.Numero = Db.Insert(SqlInsereSerie, GetParametros(serie));
        }

        public void Edita(Serie serie)
        {
            Db.Update(SqlEditaSerie, GetParametros(serie));
        }

        public void Exclui(Serie serie)
        {
            try
            {
                Db.Delete(SqlExcluiSerie, new object[] { "Numero", serie.Numero });
            }
            catch (Exception e)
            {
                throw new Exception("A serie não pode ser excluida pois está relacionada a uma Materia.", e);
            }
        }

        public Serie SelecionaPorId(int numero)
        {
            return Db.Get(SqlSelecionaSeriePorNumero, Converter, new object[] { "Numero", numero });
        }

        public List<Serie> SelecionaTodos()
        {
            return Db.GetAll<Serie>(SqlSelecionaTodasSeries, Converter);
        }

        #endregion IRepositorio

        public Serie Converter(IDataReader reader)
        {
            Serie serie = new Serie();

            serie.Numero = Convert.ToInt32(reader["numero"]);
            serie.Descricao = Convert.ToString(reader["descricao"]);

            return serie;
        }

        private object[] GetParametros(Serie serie)
        {
            return new object[]
            {
                "Numero", serie.Numero,
                "Descricao", serie.Descricao
            };
        }
    }
}